home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / program / esyrxv30.lha / EasyRexx / Includes / Modula-2 / EasyRexx.mod < prev    next >
Text File  |  1995-11-05  |  18KB  |  643 lines

  1. (*$L+*)
  2. (*$V-*)
  3. (*$R-*)
  4. (*#############################*)
  5.  IMPLEMENTATION MODULE EasyRexx;      (* 103195 *)
  6. (*#############################*)
  7.  
  8. FROM SYSTEM   IMPORT ADDRESS, ADR, BYTE, INLINE, SETREG;
  9. FROM Assembly3 IMPORT ADDQ, BEQ, JMP, JSR, LEA, MOVE, MOVEA, MOVEMea, MOVEMreg,
  10.                      MOVEQ, RTS, TST, UNLK,
  11.                      L12, W12, B12, L6,
  12.                      BitPos6, BitPos12, BitPos13,
  13.                      A0, A0b9, A1, A1b9, A2, A2b9, A3, A3b9, A4, A4b9,
  14.                      A5, A5b9, A6, A6b9, A7, A7b9,
  15.                      D0, D0b9, D1, D1b9, D2, D2b9, D3, D3b9, D4, D4b9,
  16.                      D5, D5b9, D6, D6b9, D7, D7b9,
  17.                      ARdir, ARdirb6, ARdisp, ARdispb6, ARind, ARindm,
  18.                      ARindmb6, ARindp;
  19.  
  20. FROM AmigaDOS2   IMPORT RDArgsPtr;
  21. FROM Intuition   IMPORT WindowPtr;
  22. FROM IODevices   IMPORT IOStdReqPtr;
  23. FROM Lists       IMPORT ListPtr;
  24. FROM Memory      IMPORT AllocMem, FreeMem, MemClear, MemChip, MemReqSet;
  25. FROM Ports       IMPORT MsgPortPtr;
  26. FROM RexxStorage IMPORT RexxMsgPtr;
  27. FROM Tasks       IMPORT SignalSet;
  28. FROM Text        IMPORT TextFontPtr;
  29. FROM Utility     IMPORT TagItemPtr;
  30.  
  31. TYPE ARexxCommandShellRec = RECORD
  32.                               commandWindow  :WindowPtr;
  33.                               readPort,
  34.                               writePort      :MsgPortPtr;
  35.                               readReq,
  36.                               writeReq       :IOStdReqPtr;
  37.                               prompt         :POINTER TO CHAR;
  38.                               buffer         :ARRAY[0..255] OF CHAR;
  39.                               ibuf,
  40.                               inbuffer       :CHAR;
  41.                               cursor         :BYTE;
  42.                               font           :TextFontPtr;
  43.                             END;
  44.      ARexxCommandShell = POINTER TO ARexxCommandShellRec;
  45.  
  46. TYPE ARexxContextRec = RECORD
  47.  
  48.               (*** PRIVATE ****************************)
  49.                        port             :MsgPortPtr;
  50.                        table            :POINTER TO ARRAY[0..99] OF ARexxCommandTable;
  51.                        argcopy,
  52.                        portname         :CharPointer;
  53.                        maxargs          :BYTE;
  54.                        rdargs           :RDArgsPtr;
  55.                        msg              :RexxMsgPtr;
  56.                        flags            :LONGCARD;
  57.  
  58.               (*** "PUBLIC" ****************************)
  59.                        id               :LONGINT;
  60.                        argv             :POINTER TO ARRAY[0..99] OF ADDRESS;
  61.                        Queue            :LONGCARD;       (* FROM HERE AND DOWN: ONLY AVAILABLE FROM V2 *)
  62.  
  63.               (*** PRIVATE ***************************)
  64.                        author,
  65.                        copyright,
  66.                        version,
  67.                        lasterror        :CharPointer;
  68.                        reservedcommands :ARexxCommandTablePtr;
  69.                        shell            :ARexxCommandShell;
  70.                        signals          :SignalSet;
  71.                        Result1,
  72.                        Result2          :LONGINT;
  73.                        asynchport       :MsgPortPtr;
  74.                     END;
  75.      ARexxContext = POINTER TO ARexxContextRec;
  76.  
  77.      ARexxMacroData = RECORD
  78.                         list:ListPtr;
  79.                       END;
  80.      ARexxMacro = POINTER TO ARexxMacroData;
  81.  
  82. TYPE PointerData = ARRAY[0..18] OF LONGCARD;
  83. VAR  ERRecordPointer :POINTER TO PointerData;
  84.  
  85. (*** EASYREXXMACROS ***************************************************************)
  86.  
  87. (*============================================================*)
  88.  PROCEDURE ERShellSignals(context:ARexxContext):SignalSet;
  89. (*============================================================*)
  90. BEGIN WITH context^ DO
  91.  
  92. IF shell # NIL THEN
  93.    RETURN SignalSet{CARDINAL(shell^.readPort^.mpSigBit),
  94.                     CARDINAL(shell^.commandWindow^.UserPort^.mpSigBit)};
  95. ELSE
  96.    RETURN SignalSet{};
  97. END;
  98.  
  99. END END ERShellSignals;
  100.  
  101. (*=======================================================*)
  102.  PROCEDURE ERSignals(context:ARexxContext):SignalSet;
  103. (*=======================================================*)
  104. BEGIN WITH context^ DO
  105.  
  106. RETURN SignalSet{CARDINAL(port^.mpSigBit), CARDINAL(asynchport^.mpSigBit)} + ERShellSignals(context);
  107.  
  108. END END ERSignals;
  109.  
  110. (*==================================================*)
  111.  PROCEDURE ERSignal(context:ARexxContext):SignalSet;
  112. (*==================================================*)
  113. BEGIN
  114.  
  115. IF context # NIL THEN
  116.    RETURN ERSignals(context);
  117. ELSE
  118.    RETURN SignalSet{};
  119. END;
  120.  
  121. END ERSignal;
  122.  
  123. (*========================================================*)
  124.  PROCEDURE ERSafeToQuit(context:ARexxContext):BOOLEAN;
  125. (*========================================================*)
  126. BEGIN
  127.  
  128. IF context # NIL THEN
  129.    RETURN context^.Queue = 0D;
  130. ELSE
  131.    RETURN FALSE;(*?*)
  132. END;
  133.  
  134. END ERSafeToQuit;
  135.  
  136. (*=========================================================*)
  137.  PROCEDURE ERSetSignals(context:ARexxContext; s:SignalSet);
  138. (*=========================================================*)
  139. BEGIN
  140.  
  141. IF context # NIL THEN
  142.    context^.signals := s;
  143. END;
  144.  
  145. END ERSetSignals;
  146.  
  147. (*=========================================================*)
  148.  PROCEDURE ERIsShellOpen(context:ARexxContext):BOOLEAN;
  149. (*=========================================================*)
  150. BEGIN
  151.  
  152. RETURN context^.shell # NIL;
  153.  
  154. END ERIsShellOpen;
  155.  
  156. (*=============================================*)
  157.  PROCEDURE Id(context:ARexxContext):LONGINT;
  158. (*=============================================*)
  159. BEGIN
  160.  
  161. RETURN context^.id;
  162.  
  163. END Id;
  164.  
  165. (*===============================================*)
  166.  PROCEDURE Port(context:ARexxContext):MsgPortPtr;
  167. (*===============================================*)
  168. BEGIN
  169.  
  170. RETURN context^.port;
  171.  
  172. END Port;
  173.  
  174. (*===============================================================*)
  175.  PROCEDURE Portname(context:ARexxContext; VAR nam:ARRAY OF CHAR);
  176. (*===============================================================*)
  177.  
  178. VAR  cp :CharPointer;
  179.      i  :INTEGER;
  180.  
  181. BEGIN
  182.  
  183. i := 0;
  184. cp := context^.portname;
  185. LOOP
  186.    nam[i] := cp^;
  187.    IF cp^ = 0C THEN
  188.       EXIT;
  189.    END;
  190.    INC(i);
  191.    cp := ADDRESS(cp)+1D;
  192. END;
  193.  
  194. END Portname;
  195.  
  196. (*========================================================================*)
  197.  PROCEDURE Table(context:ARexxContext; i:INTEGER):ARexxCommandTablePtr;
  198. (*========================================================================*)
  199. BEGIN
  200.  
  201. RETURN ADR(context^.table^[i]);
  202.  
  203. END Table;
  204.  
  205. (*=========================================================*)
  206.  PROCEDURE Arg(context:ARexxContext; i:INTEGER):ADDRESS;
  207. (*=========================================================*)
  208. BEGIN
  209.  
  210. RETURN context^.argv^[i];
  211.  
  212. END Arg;
  213.  
  214. (*===============================================================*)
  215.  PROCEDURE ArgNumber(context:ARexxContext; i:INTEGER):LONGINT;
  216. (*===============================================================*)
  217.  
  218. TYPE LongIntPtr = POINTER TO LONGINT;
  219. VAR  lip :LongIntPtr;
  220.  
  221. BEGIN
  222.  
  223. lip := LongIntPtr(context^.argv^[i]);
  224. RETURN lip^;
  225.  
  226. END ArgNumber;
  227.  
  228. (*===================================================================*)
  229.  PROCEDURE ArgString(context:ARexxContext; i:INTEGER):CharPointer;
  230. (*===================================================================*)
  231. BEGIN
  232.  
  233. RETURN CharPointer(context^.argv^[i]);
  234.  
  235. END ArgString;
  236.  
  237. (*=============================================================*)
  238.  PROCEDURE ArgBool(context:ARexxContext; i:INTEGER):BOOLEAN;
  239. (*=============================================================*)
  240. BEGIN
  241.  
  242. RETURN context^.argv^[i] # NIL;
  243.  
  244. END ArgBool;
  245.  
  246. (*================================================*)
  247.  PROCEDURE GetRC(context:ARexxContext):LONGINT;
  248. (*================================================*)
  249. BEGIN
  250.  
  251. IF context # NIL THEN
  252.    RETURN context^.Result1;
  253. ELSE
  254.    RETURN 0D;
  255. END;
  256.  
  257. END GetRC;
  258.  
  259. (*======================================================*)
  260.  PROCEDURE GetResult1(context:ARexxContext):LONGINT;
  261. (*======================================================*)
  262. BEGIN
  263.  
  264. RETURN GetRC(context);
  265.  
  266. END GetResult1;
  267.  
  268. (*======================================================*)
  269.  PROCEDURE GetResult2(context:ARexxContext):LONGINT;
  270. (*======================================================*)
  271. BEGIN
  272.  
  273. IF context # NIL THEN
  274.    RETURN context^.Result2;
  275. ELSE
  276.    RETURN 0D;
  277. END;
  278.  
  279. END GetResult2;
  280.  
  281. (*===============================================*)
  282.  PROCEDURE TableEnd(VAR entry:ARexxCommandTable);
  283. (*===============================================*)
  284. BEGIN WITH entry DO
  285.  
  286. id := 0D;
  287. command := NIL;
  288. cmdtemplate := NIL;
  289. userdata := NIL;
  290.  
  291. END END TableEnd;
  292.  
  293. (*==================================================*)
  294.  PROCEDURE FreeARexxContext(context:ARexxContext);
  295. (*==================================================*)
  296.  
  297. BEGIN
  298. INLINE(UNLK+A5);
  299.  
  300. (* FreeARexxContext(context)(a0) *)
  301.  
  302. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  303. INLINE(4);
  304. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  305. INLINE(4);
  306. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  307. SETREG(A6+8, EasyRexxBase);
  308. INLINE(JMP+A6+ARdisp);
  309. INLINE(-004EH);
  310.  
  311. END FreeARexxContext;
  312.  
  313. (*================================================================*)
  314.  PROCEDURE AllocARexxContextA(taglist:TagItemPtr):ARexxContext;
  315. (*================================================================*)
  316. BEGIN
  317. INLINE(UNLK+A5);
  318.  
  319. (* AllocARexxContextA(taglist)(a0) *)
  320.  
  321. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  322. INLINE(4);
  323. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  324. INLINE(4);
  325. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  326. SETREG(A6+8, EasyRexxBase);
  327. INLINE(JMP+A6+ARdisp);
  328. INLINE(-0054H);
  329.  
  330. END AllocARexxContextA;
  331.  
  332. (*======================================================*)
  333.  PROCEDURE GetARexxMsg(context:ARexxContext):BYTE;
  334. (*======================================================*)
  335. BEGIN
  336. INLINE(UNLK+A5);
  337.  
  338. (* GetARexxMsg(context)(a0) *)
  339.  
  340. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  341. INLINE(4);
  342. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  343. INLINE(4);
  344. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  345. SETREG(A6+8, EasyRexxBase);
  346. INLINE(JMP+A6+ARdisp);
  347. INLINE(-005AH);
  348.  
  349. END GetARexxMsg;
  350.  
  351. (*===========================================================================*)
  352.  PROCEDURE SendARexxCommandA(command:CharPointer; taglist:TagItemPtr):LONGINT;
  353. (*===========================================================================*)
  354. BEGIN
  355. INLINE(UNLK+A5);
  356.  
  357. (* SendARexxCommandA(command,taglist)(a1,a0) *)
  358.  
  359. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  360. INLINE(4);
  361. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  362. INLINE(8);
  363. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  364. INLINE(8);
  365. INLINE(ADDQ+L6+ 0 +A7+ARdir);
  366. SETREG(A6+8, EasyRexxBase);
  367. INLINE(JMP+A6+ARdisp);
  368. INLINE(-0060H);
  369.  
  370. END SendARexxCommandA;
  371.  
  372. (*======================================================================*)
  373.  PROCEDURE ReplyARexxMsgA(context:ARexxContext; taglist:TagItemPtr);
  374. (*======================================================================*)
  375. BEGIN
  376. INLINE(UNLK+A5);
  377.  
  378. (* ReplyARexxMsgA(context,taglist)(a1,a0) *)
  379.  
  380. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  381. INLINE(4);
  382. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  383. INLINE(8);
  384. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  385. INLINE(8);
  386. INLINE(ADDQ+L6+ 0 +A7+ARdir);
  387. SETREG(A6+8, EasyRexxBase);
  388. INLINE(JMP+A6+ARdisp);
  389. INLINE(-0066H);
  390.  
  391. END ReplyARexxMsgA;
  392.  
  393. (*=================================================================================*)
  394.  PROCEDURE ARexxCommandShellA(context:ARexxContext; taglist:TagItemPtr):BYTE;
  395. (*=================================================================================*)
  396. BEGIN
  397. INLINE(UNLK+A5);
  398.  
  399. (* ARexxCommandShellA(context,taglist)(a1,a0) *)
  400.  
  401. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  402. INLINE(4);
  403. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  404. INLINE(8);
  405. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  406. INLINE(8);
  407. INLINE(ADDQ+L6+ 0 +A7+ARdir);
  408. SETREG(A6+8, EasyRexxBase);
  409. INLINE(JMP+A6+ARdisp);
  410. INLINE(-006CH);
  411.  
  412. END ARexxCommandShellA;
  413.  
  414. (*=========================================*)
  415.  PROCEDURE CreateERRecordPointer():ADDRESS;
  416. (*=========================================*)
  417.  
  418. VAR  bRes :BOOLEAN;
  419.  
  420. BEGIN
  421.  
  422. IF ERRecordPointer = NIL THEN
  423.    ERRecordPointer := AllocMem(SIZE(PointerData), MemReqSet{MemChip, MemClear});
  424.    IF ERRecordPointer # NIL THEN
  425.       ERRecordPointer^[1] :=   3221241856D (*0C0004000H*);  (* arrow *)
  426.       ERRecordPointer^[2] :=   1879093248D (*07000B000H*);
  427.       ERRecordPointer^[3] :=   1006652416D (*03C004C00H*);
  428.       ERRecordPointer^[4] :=   1056981760D (*03F004300H*);
  429.       ERRecordPointer^[5] :=    532684992D (*01FC020C0H*);
  430.       ERRecordPointer^[6] :=    532684800D (*01FC02000H*);
  431.       ERRecordPointer^[7] :=    251662592D (*00F001100H*);
  432.       ERRecordPointer^[8] :=    226497152D (*00D801280H*);
  433.       ERRecordPointer^[9] :=     79694144D (*004C00940H*);
  434.       ERRecordPointer^[10] :=    73402528D (*0046008A0H*);
  435.       ERRecordPointer^[11] :=     2097216D (*000200040H*);
  436.  
  437.       ERRecordPointer^[13] :=       59288D (*00000E798*);   (* REC *)
  438.       ERRecordPointer^[14] :=       37924D (*000009424*);
  439.       ERRecordPointer^[15] :=       59168D (*00000E720*);
  440.       ERRecordPointer^[16] :=       37924D (*000009424*);
  441.       ERRecordPointer^[17] :=       38808D (*000009798*);
  442.    END;
  443. END;
  444.  
  445. RETURN ERRecordPointer;
  446.  
  447. END CreateERRecordPointer;
  448.  
  449. (*==============================*)
  450.  PROCEDURE FreeERRecordPointer();
  451. (*==============================*)
  452.  
  453. BEGIN
  454.  
  455. IF ERRecordPointer # NIL THEN
  456.    FreeMem(ERRecordPointer, SIZE(PointerData));
  457.    ERRecordPointer := NIL;
  458. END;
  459.  
  460. END FreeERRecordPointer;
  461.  
  462. (*========================================================*)
  463.  PROCEDURE AllocARexxMacroA(taglist:TagItemPtr):ARexxMacro;
  464. (*========================================================*)
  465. BEGIN
  466. INLINE(UNLK+A5);
  467.  
  468. (* AllocARexxMacroA(taglist)(a0) *)
  469.  
  470. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  471. INLINE(4);
  472. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  473. INLINE(4);
  474. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  475. SETREG(A6+8, EasyRexxBase);
  476. INLINE(JMP+A6+ARdisp);
  477. INLINE(-0078H);
  478.  
  479. END AllocARexxMacroA;
  480.  
  481. (*====================================================*)
  482.  PROCEDURE IsARexxMacroEmpty(macro:ARexxMacro):BYTE;
  483. (*====================================================*)
  484. BEGIN
  485. INLINE(UNLK+A5);
  486.  
  487. (* IsARexxMacroEmpty(macro)(a0) *)
  488.  
  489. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  490. INLINE(4);
  491. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  492. INLINE(4);
  493. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  494. SETREG(A6+8, EasyRexxBase);
  495. INLINE(JMP+A6+ARdisp);
  496. INLINE(-007EH);
  497.  
  498. END IsARexxMacroEmpty;
  499.  
  500. (*==========================================*)
  501.  PROCEDURE ClearARexxMacro(macro:ARexxMacro);
  502. (*==========================================*)
  503. BEGIN
  504. INLINE(UNLK+A5);
  505.  
  506. (* ClearARexxMacro(macro)(a0) *)
  507.  
  508. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  509. INLINE(4);
  510. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  511. INLINE(4);
  512. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  513. SETREG(A6+8, EasyRexxBase);
  514. INLINE(JMP+A6+ARdisp);
  515. INLINE(-0084H);
  516.  
  517. END ClearARexxMacro;
  518.  
  519. (*==========================================*)
  520.  PROCEDURE FreeARexxMacro(macro:ARexxMacro);
  521. (*==========================================*)
  522. BEGIN
  523. INLINE(UNLK+A5);
  524.  
  525. (* FreeARexxMacro(macro)(a0) *)
  526.  
  527. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  528. INLINE(4);
  529. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  530. INLINE(4);
  531. INLINE(ADDQ+L6+ 2048 +A7+ARdir);
  532. SETREG(A6+8, EasyRexxBase);
  533. INLINE(JMP+A6+ARdisp);
  534. INLINE(-008AH);
  535.  
  536. END FreeARexxMacro;
  537.  
  538. (*==================================================================+++++==*)
  539.  PROCEDURE AddARexxMacroCommandA(macro:ARexxMacro; taglist:TagItemPtr):BYTE;
  540. (*====================================================================+++++*)
  541. BEGIN
  542. INLINE(UNLK+A5);
  543.  
  544. (* AddARexxMacroCommandA(macro,taglist)(a1,a0) *)
  545.  
  546. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  547. INLINE(4);
  548. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  549. INLINE(8);
  550. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  551. INLINE(8);
  552. INLINE(ADDQ+L6+ 0 +A7+ARdir);
  553. SETREG(A6+8, EasyRexxBase);
  554. INLINE(JMP+A6+ARdisp);
  555. INLINE(-0090H);
  556.  
  557. END AddARexxMacroCommandA;
  558.  
  559. (*========================================================================================*)
  560.  PROCEDURE WriteARexxMacroA(context:ARexxContext; macro:ARexxMacro; macroname:CharPointer;
  561.                             taglist:TagItemPtr):BYTE;
  562. (*========================================================================================*)
  563. BEGIN
  564. INLINE(UNLK+A5);
  565.  
  566. (* WriteARexxMacroA(context,macro,macroname,taglist)(a1,a2,a3,a0) *)
  567.  
  568. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  569. INLINE(4);
  570. INLINE(MOVEA+L12+A3b9+A7+ARdisp);
  571. INLINE(8);
  572. INLINE(MOVEA+L12+A2b9+A7+ARdisp);
  573. INLINE(12);
  574. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  575. INLINE(16);
  576. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  577. INLINE(16);
  578. INLINE(LEA+A7b9+A7+ARdisp);
  579. INLINE(16);
  580. SETREG(A6+8, EasyRexxBase);
  581. INLINE(JMP+A6+ARdisp);
  582. INLINE(-0096H);
  583.  
  584. END WriteARexxMacroA;
  585.  
  586. (*=========================================================================*)
  587.  PROCEDURE RunARexxMacroA(context:ARexxContext; taglist:TagItemPtr):BYTE;
  588. (*=========================================================================*)
  589. BEGIN
  590. INLINE(UNLK+A5);
  591.  
  592. (* RunARexxMacroA(context,taglist)(a1,a0) *)
  593.  
  594. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  595. INLINE(4);
  596. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  597. INLINE(8);
  598. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  599. INLINE(8);
  600. INLINE(ADDQ+L6+ 0 +A7+ARdir);
  601. SETREG(A6+8, EasyRexxBase);
  602. INLINE(JMP+A6+ARdisp);
  603. INLINE(-009CH);
  604.  
  605. END RunARexxMacroA;
  606.  
  607. (*=====================================================================*)
  608.  PROCEDURE CreateARexxStemA(context:ARexxContext; stemname:CharPointer;
  609.                             VAR vars:ARRAY OF CharPointer):BYTE;
  610. (*=====================================================================*)
  611. BEGIN
  612. INLINE(UNLK+A5);
  613.  
  614. (* CreateARexxStemA(context,stemname,vars)(a1,a2,a0,<d0>) *)
  615.  
  616. (*INLINE(MOVEQ+D0b9);*)
  617. (*INLINE(MOVE+W12+D0b9+A7+ARdisp);*)
  618. (*INLINE(4);*)
  619. INLINE(MOVEA+L12+A0b9+A7+ARdisp);
  620. INLINE(6);
  621. INLINE(MOVEA+L12+A2b9+A7+ARdisp);
  622. INLINE(10);
  623. INLINE(MOVEA+L12+A1b9+A7+ARdisp);
  624. INLINE(14);
  625. INLINE(MOVE+L12 +A7b9+ARdispb6 +A7+ARind);
  626. INLINE(14);
  627. INLINE(LEA+A7b9+A7+ARdisp);
  628. INLINE(14);
  629. SETREG(A6+8, EasyRexxBase);
  630. INLINE(JMP+A6+ARdisp);
  631. INLINE(-00A2H);
  632.  
  633. END CreateARexxStemA;
  634.  
  635. (*----------------------*)
  636.  BEGIN (* mod init code *)
  637. (*----------------------*)
  638.  
  639. EasyRexxBase := NIL;
  640. ERRecordPointer := NIL;
  641.  
  642. END EasyRexx.
  643.